﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using negocios;
using objetos;
using publico;
using System.Transactions;

namespace softsales.pagina.ordem_producao
{
    public partial class ordem_producao_incluir : System.Web.UI.Page
    {
        BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();
        BLL_TB_UNIDADE_MEDIDA b_tb_unidade_medida = new BLL_TB_UNIDADE_MEDIDA();
        BLL_TB_TIPO_SITUACAO_ORDEM_PRODUCAO b_tb_tipo_situacao_ordem_producao = new BLL_TB_TIPO_SITUACAO_ORDEM_PRODUCAO();        
        OBJ_TB_ORDEM_PRODUCAO o_tb_ordem_producao = new OBJ_TB_ORDEM_PRODUCAO();
        BLL_TB_ORDEM_PRODUCAO b_tb_ordem_producao = new BLL_TB_ORDEM_PRODUCAO();

        BLL_TB_ORDEM_PRODUCAO_ITEM b_tb_ordem_producao_item = new BLL_TB_ORDEM_PRODUCAO_ITEM();
        OBJ_TB_ORDEM_PRODUCAO_ITEM o_tb_ordem_producao_item = new OBJ_TB_ORDEM_PRODUCAO_ITEM();

        OBJ_TB_CADASTRO o_tb_cadastro = new OBJ_TB_CADASTRO();
        BLL_TB_CADASTRO b_tb_cadastro = new BLL_TB_CADASTRO();

        BLL_TB_PRODUTO b_tb_produto = new BLL_TB_PRODUTO();
        OBJ_TB_PRODUTO o_tb_produto = new OBJ_TB_PRODUTO();

        private int id_ordem_producao { get; set; }
        private int id_pedido { get; set; }


        BLL_TB_LOG_ERRO b_tb_log_erro = new BLL_TB_LOG_ERRO();
        protected void Page_Load(object sender, EventArgs e)
        {
            if (PUB_SESSAO.Logado())
            {
                if (!IsPostBack)
                {
                    b_tb_tipo_situacao_ordem_producao.PreencheControle(DDL_ID_SITUACAO_ORDEM_PRODUCAO, false);
                    b_tb_empresa.PreencheControleWeb(DDL_ID_EMPRESA, true);
                    b_tb_unidade_medida.PreencheControle(DDL_ID_UNIDADE_MEDIDA, true);


                    TXT_DT_EMISSAO.Text = DateTime.Now.ToShortDateString();
                    DDL_ID_SITUACAO_ORDEM_PRODUCAO.SelectedValue = string.Format("{0}",(int)PUB_ENUM.TIPO_SITUACAO_ORDEM_PRODUCAO.ABERTO);
                    DDL_ID_SITUACAO_ORDEM_PRODUCAO.Enabled = false;

                    if (Request["id_pedido"] != null)
                    {
                        CarregaPedido(Convert.ToInt32(Request["id_pedido"].ToString()));
                    }

                }
                else
                {
                    if (Session["id_produto"] != null)
                    {
                        int id_produto = Convert.ToInt32(Session["id_produto"].ToString());
                        o_tb_produto = b_tb_produto.SelecionarObjetoPorId(id_produto);
                        TXT_ID_PRODUTO_SERVICO.Text = id_produto.ToString();
                        TXT_DESC_PRODUTO_SERVICO.Text = o_tb_produto.descricao.ToString();
                        DDL_ID_UNIDADE_MEDIDA.SelectedValue = o_tb_produto.id_unidade_medida.ToString();
                        Session.Remove("id_produto");
                    }

                    if(Session["id_cadastro"] !=null)
                    {
                        int id_cadastro = Convert.ToInt32(Session["id_cadastro"].ToString());

                        o_tb_cadastro = b_tb_cadastro.SelecionarObjetoPorId(id_cadastro);

                        TXT_ID_CADASTRO.Text = id_cadastro.ToString();
                        TXT_NOME_CADASTRO.Text = o_tb_cadastro.nome.ToString();

                        Session.Remove("id_cadastro");
                    }

                    if (Session["id_pedido"] != null)
                    {
                        int id_pedido = Convert.ToInt32(Session["id_pedido"].ToString());

                        TXT_ID_PEDIDO.Text = id_pedido.ToString();

                        Session.Remove("id_pedido");
                    }


                }
            }
        }
       
        private void CarregaPedido(int id_pedido)
        {
            try
            {
                OBJ_TB_PEDIDO o_tb_pedido = new OBJ_TB_PEDIDO();
                BLL_TB_PEDIDO b_tb_pedido = new BLL_TB_PEDIDO();
                BLL_TB_CADASTRO b_tb_cadastro = new BLL_TB_CADASTRO();
                BLL_TB_PEDIDO_ITEM b_tb_pedido_item = new BLL_TB_PEDIDO_ITEM();
                BLL_TB_PRODUTO_ESTRUTURA b_tb_produto_estrutura = new BLL_TB_PRODUTO_ESTRUTURA();
                

                o_tb_pedido = b_tb_pedido.SelecionarObjetoPorId(id_pedido);
                o_tb_pedido.Tb_cadastro = b_tb_cadastro.SelecionarObjetoPorId(o_tb_pedido.id_cadastro);
                o_tb_pedido.Lista_pedido_item = b_tb_pedido_item.SelecionarLista(string.Format("tb_pedido_item.id_pedido ={0}", id_pedido), "");

                // passo as variaveis do pedido para ordem de producao;
                o_tb_ordem_producao.dt_emissao = DateTime.Now;
                o_tb_ordem_producao.dt_final_producao = null;
                o_tb_ordem_producao.dt_inicio_producao = DateTime.Now;
                o_tb_ordem_producao.id_cadastro  = o_tb_pedido.id_cadastro;
                o_tb_ordem_producao.id_empresa = o_tb_pedido.id_empresa;
                o_tb_ordem_producao.id_pedido = o_tb_pedido.id;
                o_tb_ordem_producao.id_situacao_ordem_producao = (int)PUB_ENUM.TIPO_SITUACAO_ORDEM_PRODUCAO.ABERTO;
                o_tb_ordem_producao.qtd_produzida = 0;
                o_tb_ordem_producao.num_ordem_producao = b_tb_ordem_producao.GerarNumeroProducao(o_tb_pedido.id_empresa, o_tb_pedido.id, Convert.ToInt32(TXT_ID_PRODUTO_SERVICO.Text));
                o_tb_ordem_producao.observacao = o_tb_pedido.observacao;
                o_tb_ordem_producao.id_usuario_criador = PUB_SESSAO.Id;                
                
                for(int i = 0 ; i<=o_tb_pedido.Lista_pedido_item.Count - 1 ; i++)
                {                    
                    o_tb_ordem_producao.id_produto_servico = o_tb_pedido.Lista_pedido_item[i].id;                    
                    o_tb_ordem_producao.qtd_produzir = o_tb_pedido.Lista_pedido_item[i].qtd;
                    o_tb_ordem_producao.id_unidade_medida = o_tb_pedido.Lista_pedido_item[i].id_unidade_medida;
                }

                // incluir ordem de producao
                id_ordem_producao = b_tb_ordem_producao.Incluir(o_tb_ordem_producao);

                // passo a estrutura do produto para a ordem de producao item

                
                foreach (OBJ_TB_PRODUTO_ESTRUTURA o_tb_produto_estrutura in b_tb_produto_estrutura.SelecionarLista(string.Format("tb_produto_estrutura.id_produto_pai ={0}", o_tb_ordem_producao.id_produto_servico), ""))
                {
                    o_tb_ordem_producao_item = new OBJ_TB_ORDEM_PRODUCAO_ITEM();
                    o_tb_ordem_producao_item.id_ordem_producao = id_ordem_producao;
                    o_tb_ordem_producao_item.id_produto_servico = o_tb_produto_estrutura.id_produto_filho;
                    o_tb_ordem_producao_item.id_usuario = PUB_SESSAO.Id;
                    o_tb_ordem_producao_item.qtd = o_tb_produto_estrutura.qtd;
                    o_tb_ordem_producao_item.valor_unitario = o_tb_produto_estrutura.valor_unitario;                    
                    b_tb_ordem_producao_item.Incluir(o_tb_ordem_producao_item);
                }
                
                

            }
            catch (Exception)
            {
                
                throw;
            }
          
                       

           
        }

        private void Editar(String id)
        {
            try
            {
                o_tb_ordem_producao = b_tb_ordem_producao.SelecionarObjetoPorId(Convert.ToInt32(id));

                HF_ID.Value = o_tb_ordem_producao.id.ToString();
                TXT_NUM_ORDEM_PRODUCAO.Text = o_tb_ordem_producao.num_ordem_producao.ToString();
                DDL_ID_EMPRESA.SelectedValue = b_tb_empresa.SelecionarObjetoPorId(o_tb_ordem_producao.id_empresa).nome.ToString();
                TXT_ID_CADASTRO.Text = o_tb_ordem_producao.id_cadastro.ToString();
                TXT_NOME_CADASTRO.Text = b_tb_cadastro.SelecionarObjetoPorId(o_tb_ordem_producao.id_cadastro).nome.ToString();
                DDL_ID_SITUACAO_ORDEM_PRODUCAO.SelectedValue = o_tb_ordem_producao.id_situacao_ordem_producao.ToString();
                TXT_ID_PRODUTO_SERVICO.Text = o_tb_ordem_producao.id_produto_servico.ToString();
                TXT_ID_PEDIDO.Text = o_tb_ordem_producao.id_pedido.ToString();
                TXT_DESC_PRODUTO_SERVICO.Text = b_tb_produto.SelecionarObjetoPorId(o_tb_ordem_producao.id_produto_servico).descricao.ToString();
                TXT_DT_INICIO_PRODUCAO.Text = PUB_FUNCOES.FormataDataBR(o_tb_ordem_producao.dt_inicio_producao.ToString());
                TXT_DT_FINAL_PRODUCAO.Text = PUB_FUNCOES.FormataDataBR(o_tb_ordem_producao.dt_final_producao.ToString());
                TXT_QTD_PRODUZIDA.Text = o_tb_ordem_producao.qtd_produzida.ToString();
                TXT_QTD_PRODUZIR.Text = o_tb_ordem_producao.qtd_produzir.ToString();
                TXT_OBSERVACAO.Text = o_tb_ordem_producao.observacao.ToString();
                DDL_ID_UNIDADE_MEDIDA.SelectedValue = o_tb_ordem_producao.id_unidade_medida.ToString();
                TXT_DT_EMISSAO.Text = PUB_FUNCOES.FormataDataBR(o_tb_ordem_producao.dt_emissao.ToString());


                PreencheOrdemProducaoItem();

                
                TXT_NUM_ORDEM_PRODUCAO.Enabled = false;
                DDL_ID_EMPRESA.Enabled = false;
                TXT_ID_CADASTRO.Enabled = false;
                TXT_NOME_CADASTRO.Enabled = false;
                TXT_ID_PRODUTO_SERVICO.Enabled = false;
                TXT_ID_PEDIDO.Enabled = false;
                TXT_DESC_PRODUTO_SERVICO.Enabled = false;
                TXT_DT_INICIO_PRODUCAO.Enabled = false;
                DDL_ID_UNIDADE_MEDIDA.Enabled = false;
                TXT_DT_EMISSAO.Enabled = false;




            }
            catch (Exception)
            {

                throw;
            }



        }



        protected void BTN_SALVAR_Click(object sender, EventArgs e)
        {

            try
            {
                int id_ordem_producao = 0;

                if (TXT_ID_PEDIDO.Text != string.Empty && TXT_ID_PRODUTO_SERVICO.Text != string.Empty && TXT_ID_CADASTRO.Text != string.Empty)
                {


                    o_tb_ordem_producao.dt_emissao = DateTime.Now;
                    if (TXT_DT_FINAL_PRODUCAO.Text != string.Empty)
                        o_tb_ordem_producao.dt_final_producao = Convert.ToDateTime(TXT_DT_FINAL_PRODUCAO.Text);

                    if (TXT_DT_INICIO_PRODUCAO.Text != string.Empty)
                        o_tb_ordem_producao.dt_inicio_producao = Convert.ToDateTime(TXT_DT_INICIO_PRODUCAO.Text);

                    if (TXT_ID_CADASTRO.Text != string.Empty)
                        o_tb_ordem_producao.id_cadastro = Convert.ToInt32(TXT_ID_CADASTRO.Text);

                    if (DDL_ID_EMPRESA.SelectedValue != string.Empty)
                        o_tb_ordem_producao.id_empresa = Convert.ToInt32(DDL_ID_EMPRESA.SelectedValue);
                

                    if (TXT_ID_PEDIDO.Text != string.Empty)
                        o_tb_ordem_producao.id_pedido = Convert.ToInt32(TXT_ID_PEDIDO.Text);




                    o_tb_ordem_producao.id_produto_servico = Convert.ToInt32(TXT_ID_PRODUTO_SERVICO.Text);
                    o_tb_ordem_producao.id_situacao_ordem_producao = Convert.ToInt32(DDL_ID_SITUACAO_ORDEM_PRODUCAO.SelectedValue);
                    o_tb_ordem_producao.id_unidade_medida = Convert.ToInt32(DDL_ID_UNIDADE_MEDIDA.SelectedValue);
                    o_tb_ordem_producao.id_usuario_criador = PUB_SESSAO.Id;
                    o_tb_ordem_producao.num_ordem_producao = b_tb_ordem_producao.GerarNumeroProducao(o_tb_ordem_producao.id_empresa, o_tb_ordem_producao.id_pedido, o_tb_ordem_producao.id_produto_servico);
                    o_tb_ordem_producao.observacao = TXT_OBSERVACAO.Text;
                    o_tb_ordem_producao.qtd_produzida = Convert.ToDecimal(PUB_FUNCOES.TrataDecimal(TXT_QTD_PRODUZIDA.Text));
                    o_tb_ordem_producao.qtd_produzir = Convert.ToDecimal(PUB_FUNCOES.TrataDecimal(TXT_QTD_PRODUZIR.Text));

                    id_ordem_producao  =  b_tb_ordem_producao.Incluir(o_tb_ordem_producao);

                    string msg = string.Format("Ordem de Produção Nº {0} foi criada com sucesso", id_ordem_producao);

                    Master.MSG_ALERTA(msg,string.Format("ordem_producao_editar.aspx?id={0}",id_ordem_producao),false);
                    
                }
            }
            catch (Exception)
            {
                
                throw;
            }
           
        }

        protected void BTN_CANCELAR_Click(object sender, EventArgs e)
        {
            Response.Redirect("default.aspx", false);
        }

        protected void BTN_INCLUIR_ITEM_Click(object sender, EventArgs e)
        {
            try
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    if (HF_ID.Value == string.Empty)
                    {
                        HF_ID.Value =  IncluirOrdemProducao().ToString();
                    }

                    if (b_tb_ordem_producao_item.ExisteItem(Convert.ToInt32(HF_ID.Value), Convert.ToInt32(TXT_ID_PRODUTO_SERVICO_ITEM.Text))) 

                        IncluirOrdemProducaoItem();
                        PreencheOrdemProducaoItem();
                    


                    scope.Complete();

                    scope.Dispose();
                }
               
            }
            catch (Exception)
            {
                
                throw;
            }
        }
       

        private int IncluirOrdemProducao()
        {

            try
            {
                int id_ordem_producao = 0;
                o_tb_ordem_producao.dt_emissao = DateTime.Now;
                if (TXT_DT_FINAL_PRODUCAO.Text != string.Empty)
                    o_tb_ordem_producao.dt_final_producao = Convert.ToDateTime(TXT_DT_FINAL_PRODUCAO.Text);
                if (TXT_DT_INICIO_PRODUCAO.Text != string.Empty)
                    o_tb_ordem_producao.dt_inicio_producao = Convert.ToDateTime(TXT_DT_INICIO_PRODUCAO.Text);

                o_tb_ordem_producao.id_cadastro = Convert.ToInt32(TXT_ID_CADASTRO.Text);
                o_tb_ordem_producao.id_empresa = Convert.ToInt32(DDL_ID_EMPRESA.SelectedValue);
                o_tb_ordem_producao.id_pedido = Convert.ToInt32(TXT_ID_PEDIDO.Text);
                o_tb_ordem_producao.id_produto_servico = Convert.ToInt32(TXT_ID_PRODUTO_SERVICO.Text);
                o_tb_ordem_producao.id_situacao_ordem_producao = Convert.ToInt32(DDL_ID_SITUACAO_ORDEM_PRODUCAO.SelectedValue);
                o_tb_ordem_producao.id_unidade_medida = Convert.ToInt32(DDL_ID_UNIDADE_MEDIDA.SelectedValue);
                o_tb_ordem_producao.id_usuario_criador = PUB_SESSAO.Id;
                o_tb_ordem_producao.num_ordem_producao = b_tb_ordem_producao.GerarNumeroProducao(o_tb_ordem_producao.id_empresa, o_tb_ordem_producao.id_pedido, o_tb_ordem_producao.id_produto_servico);
                o_tb_ordem_producao.id_situacao_ordem_producao = Convert.ToInt32(DDL_ID_SITUACAO_ORDEM_PRODUCAO.SelectedValue);
                o_tb_ordem_producao.observacao = TXT_OBSERVACAO.Text;
                o_tb_ordem_producao.qtd_produzida = Convert.ToInt32(TXT_QTD_PRODUZIDA.Text);
                o_tb_ordem_producao.qtd_produzir = Convert.ToInt32(TXT_QTD_PRODUZIR.Text);
                id_ordem_producao = b_tb_ordem_producao.Incluir(o_tb_ordem_producao);

                return id_ordem_producao;
            
            }
            catch (Exception)
            {
                
                throw;
            }
            
               

        }

        private void IncluirOrdemProducaoItem()
        {
       
            try
            {
                if(TXT_ID_PEDIDO.Text != string.Empty && TXT_ID_PRODUTO_SERVICO_ITEM.Text != string.Empty && TXT_QTD.Text != string.Empty)
                {
                
                    id_ordem_producao = Convert.ToInt32(PUB_FUNCOES.TrataInteiro(HF_ID.Value));
                    id_pedido = Convert.ToInt32(PUB_FUNCOES.TrataInteiro(TXT_ID_PEDIDO.Text));                   
                    o_tb_ordem_producao_item.dt_lancamento = DateTime.Now;
                    o_tb_ordem_producao_item.id_ordem_producao = id_ordem_producao;
                    o_tb_ordem_producao_item.id_produto_servico = Convert.ToInt32(TXT_ID_PRODUTO_SERVICO_ITEM.Text);
                    o_tb_ordem_producao_item.id_usuario = PUB_SESSAO.Id;
                    o_tb_ordem_producao_item.qtd = Convert.ToDecimal(TXT_QTD.Text);
                    o_tb_ordem_producao_item.valor_unitario = Convert.ToDecimal(TXT_VALOR_UNITARIO.Text);
                    b_tb_ordem_producao_item.Incluir(o_tb_ordem_producao_item);

                }

            }
            catch (Exception)
            {
                
                throw;
            }

        }

        private void IncluirOrdemProducaoHistorico(string historico)
        {
            OBJ_TB_ORDEM_PRODUCAO_HISTORICO o_tb_ordem_producao_historico = new OBJ_TB_ORDEM_PRODUCAO_HISTORICO();
            BLL_TB_ORDEM_PRODUCAO_HISTORICO b_tb_ordem_producao_historico = new BLL_TB_ORDEM_PRODUCAO_HISTORICO();
            try
            {
                o_tb_ordem_producao_historico.desc_ordem_producao_historico = historico;
                o_tb_ordem_producao_historico.dt_atualizacao = DateTime.Now;
                o_tb_ordem_producao_historico.id_ordem_producao = id_ordem_producao;
                o_tb_ordem_producao_historico.id_usuario = PUB_SESSAO.Id;
                b_tb_ordem_producao_historico.Incluir(o_tb_ordem_producao_historico);

            }
            catch (Exception)
            {
                
                throw;
            }
         

        }

        private void PreencheOrdemProducaoItem()
        {
            try
            {
                GRV_TB_ORDEM_PRODUCAO_ITEM.DataSource = b_tb_ordem_producao_item.Selecionar(string.Format("tb_ordem_producao_item.id_ordem_producao ={0}", HF_ID.Value), "");
                GRV_TB_ORDEM_PRODUCAO_ITEM.DataBind();
            }
            catch (Exception)
            {
                
                throw;
            }
            

        }

        protected void IMG_BTN_EXCLUIR_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                ImageButton btn = (ImageButton)sender;

                if(btn != null)
                {
                    int id = Convert.ToInt32(btn.CommandArgument);

                    o_tb_ordem_producao_item = b_tb_ordem_producao_item.SelecionarObjetoPorId(id);
                    b_tb_ordem_producao_item.Excluir(o_tb_ordem_producao_item);
                }
                
            }
            catch (Exception)
            {
                
                throw;
            }
        }

    }
}